package com.appspot.abcensys.shared;

import java.util.ArrayList;
import java.util.logging.Logger;

import com.appspot.abcensys.client.AbcensysService;
import com.appspot.abcensys.client.AbcensysServiceAsync;
import com.appspot.abcensys.client.AdminPanel;
import com.appspot.abcensys.client.AfwezigheidInzien;
import com.appspot.abcensys.client.AfwezigheidMelden;
import com.appspot.abcensys.client.Dashboard;
import com.appspot.abcensys.client.GebruikerInstellingWijzigen;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.RootPanel;

/**
 * MenuFactory maakt en toont het menu
 * 
 * 
 * @author Hugo Zonderland
 * @author Niels Timmer
 */

public class MenuFactory {
	
	// Logger
	private Logger log = Logger.getLogger(MenuFactory.class.toString());

	// Service
	private AbcensysServiceAsync service = (AbcensysServiceAsync) GWT.create(AbcensysService.class);

	/**
	 * Maakt de MenuItems aan
	 * 
	 * @return ArrayList<MenuItem> met MenuItems
	 */
	public ArrayList<MenuItem> getMenuItems() {
		ArrayList<MenuItem> menuItems = new ArrayList<MenuItem>();

		// Inloggen
		Command cInloggen = new Command() {
			@Override
			public void execute() {
				service.getLoginUrl(new AsyncCallback<String>() {
					public void onFailure(Throwable caught) {
						// Window.open(loginUrl, "_self", "");
						log.info("KAN GEEN LOGIN URL MAKEN " + caught.getMessage());
					}

					public void onSuccess(String loginUrl) {
						Window.open(loginUrl, "_self", "");
					}
				});
			}
		};

		Image imgLogin = new Image();
		imgLogin.setAltText("Inloggen");
		imgLogin.setUrl("style/icon/key_go.png");

		MenuItem mInloggen = new MenuItem("Inloggen", cInloggen);
		mInloggen.addType(Gebruiker.TYPE_GAST);
		mInloggen.setImg(imgLogin);

		menuItems.add(mInloggen);

		// Dashboard
		Command cDashboard = new Command() {
			@Override
			public void execute() {
				new Dashboard();
			}
		};

		Image imgDashboard = new Image();
		imgDashboard.setAltText("Dashboard");
		imgDashboard.setUrl("style/icon/map.png");

		MenuItem mDash = new MenuItem("Dashboard", cDashboard);
		mDash.addType(Gebruiker.TYPE_STUDENT);
		mDash.addType(Gebruiker.TYPE_DOCENT);
		mDash.addType(Gebruiker.TYPE_TEAMLEIDER);
		mDash.addType(Gebruiker.TYPE_MANAGER_BEDRIJFSVOERING);
		mDash.setImg(imgDashboard);

		menuItems.add(mDash);

		// Afwezigheid melden
		Command cAfwezigMelden = new Command() {
			@Override
			public void execute() {
				new AfwezigheidMelden();
			}
		};

		Image imgAfwezigheidMelden = new Image();
		imgAfwezigheidMelden.setAltText("Afwezigheid melden");
		imgAfwezigheidMelden.setUrl("style/icon/user_delete.png");

		MenuItem mMelden = new MenuItem("Afwezigheid melden", cAfwezigMelden);
		mMelden.addType(Gebruiker.TYPE_STUDENT);
		mMelden.setImg(imgAfwezigheidMelden);

		menuItems.add(mMelden);

		// Mijn afwezigheid
		Command cAfwezigheidInzien = new Command() {
			@Override
			public void execute() {
				RootPanel.get("content").clear();
				new AfwezigheidInzien();
			}
		};

		Image imgAfwezigheidInzien = new Image();
		imgAfwezigheidInzien.setAltText("Mijn afwezigheid");
		imgAfwezigheidInzien.setUrl("style/icon/information.png");

		MenuItem mInzien = new MenuItem("Mijn afwezigheid", cAfwezigheidInzien);
		mInzien.addType(Gebruiker.TYPE_STUDENT);
		mInzien.addType(Gebruiker.TYPE_DOCENT);
		mInzien.setImg(imgAfwezigheidInzien);

		menuItems.add(mInzien);

		// Instellingen
		Command cInstellingen = new Command() {
			public void execute() {
				RootPanel.get("content").clear();
				new GebruikerInstellingWijzigen();
			}
		};

		Image imgInstelling = new Image();
		imgInstelling.setAltText("Instellingen");
		imgInstelling.setUrl("style/icon/monitor_edit.png");

		MenuItem mInstellingen = new MenuItem("Instellingen", cInstellingen);
		mInstellingen.addType(Gebruiker.TYPE_DOCENT);
		mInstellingen.setImg(imgInstelling);

		menuItems.add(mInstellingen);

		// Uitloggen
		Command cUitloggen = new Command() {
			@Override
			public void execute() {
				service.getLogoutUrl(new AsyncCallback<String>() {
					public void onFailure(Throwable caught) {
						// Window.open(loginUrl, "_self", "");
						log.info("KAN GEEN LOGOUT URL MAKEN " + caught.getMessage());
					}

					public void onSuccess(String logoutUrl) {
						Window.open(logoutUrl, "_self", "");
					}
				});
			}
		};

		Image imgUitloggen = new Image();
		imgUitloggen.setAltText("Uitloggen");
		imgUitloggen.setUrl("style/icon/key_delete.png");

		MenuItem mUitloggen = new MenuItem("Uitloggen", cUitloggen);
		mUitloggen.addType(Gebruiker.TYPE_STUDENT);
		mUitloggen.addType(Gebruiker.TYPE_DOCENT);
		mUitloggen.addType(Gebruiker.TYPE_TEAMLEIDER);
		mUitloggen.addType(Gebruiker.TYPE_MANAGER_BEDRIJFSVOERING);
		mUitloggen.setImg(imgUitloggen);

		menuItems.add(mUitloggen);

		return menuItems;
	}

	/**
	 * Returns the MenuBar.
	 */
	public void refreshMenuBar() {
		service.getHuidigeGebruiker(new AsyncCallback<Gebruiker>() {
			@Override
			public void onFailure(Throwable caught) {
				RootPanel.get().add(new HTML(caught.getMessage()));
				log.info("Service failure -> getHuidigeGebruiker -> " + caught.getMessage());
			}

			@Override
			public void onSuccess(Gebruiker g) {
				MenuFactory mf = new MenuFactory();
				ArrayList<MenuItem> menuItems = mf.getMenuItems();
				MenuBar menuBar = new MenuBar(false);				
				if (g == null) {
					g = new Gebruiker();
					g.setType(Gebruiker.TYPE_GAST);
				} 
				
				// AdminPanel
				if (g.getIsAdministrator()) {
					Command cAdminPanel = new Command() {
						@Override
						public void execute() {
							new AdminPanel();
						}
					};
	
					Image imgAdminPanel = new Image();
					imgAdminPanel.setAltText("Administratie");
					imgAdminPanel.setUrl("style/icon/group_gear.png");
	
					MenuItem mAdminPanel = new MenuItem("Administratie", cAdminPanel);
					mAdminPanel.addType(g.getType()); 
					mAdminPanel.setImg(imgAdminPanel);
	
					menuItems.add(mAdminPanel);
				}

				for (MenuItem mi : menuItems) {
					if (g.getIsAdministrator() || mi.allowed(g.getType())) {
						HTML img = new HTML();
						img.setHTML(mi.getImg().toString());
						menuBar.addItem(mi.getTitle() + " " + img.getHTML(), true, mi.getCmd());
					}
				}
				
				RootPanel.get("menu").add(menuBar);
			}
		});
	}
}
